package com.nanbei.rabbit.consumer.confirm;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * @ClassDescription: 延时队列监听着  监听死信队列
 * @JdkVersion: 1.8
 * @Author: libs
 * @Created: 2024/8/30 14:55
 */
@Component
public class DelayDirectConsumerListener {



    /**
     * manual(手动应答)
     *
     * 解决死循环:指定最大的重试次数
     * 消息的实际消费次数应该怎么计算? 借助于Redis
     * 一旦消息的实际消费次数大于最大消费次数，那么此时需要给rabbitmg返回ack, 在返回之前需要把消息写入到数据库中，后期人工处理
     */
    @RabbitListener(queues = "delay_direct_queue")
    public void listener02(Message message, Channel channel){  //message 对象封装消息信息
        byte[] body = message.getBody();  // 获取的消息内容
        String msg = new String(body);

       try {
           // 进行业务处理
           // int a = 10/0;
           System.out.println("delay_direct_queue:"+msg);

           //给rabbitmg服务端返回ack
           //第一个参数:表示的就是消息的标签，用来表示消息的唯一性
           //第二个参数:是否需要进行批量应答
           channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
           System.out.println("======================================");
       }catch (Exception e){
           e.printStackTrace();

           //给rabbitmg服务端返回 uack
           //第三个参数:表示的意思是是否需要将消息重新加入到队列中
           try {
               channel.basicNack(message.getMessageProperties().getDeliveryTag(),true,true);
           } catch (IOException ioException) {
               ioException.printStackTrace();
           }
       }

    }
}
